package tcp.project;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
    TCP通信：客户端与服务器建立一个逻辑连接，使用客户端IO对象进行通信,双方不存在调用关系，是相互的通讯关系

    TCP客户端：向服务器发送连接请求，给服务器发送数据，读取服务器回写的数据
    表示客户端的类：Socket，此类实现客户端套接字，套接字是计算机之间连接的端点，套接字包含Ip地址和端口号

    构造方法：Socket（String host ， int prot）：创建一个流套接字并将其连接到指定主机上的指定端口号
            参数：String host ：服务器的主机名称/服务器的IP地址
                 int prot：服务器的端口号

    实现步骤：代码需要抛出异常
             1.创建一个客户端对象Socket，构造方法中绑定服务器的IP地址和端口号（可自定义）
             2.使用Socket对象中的getOutputStream（）方法获取网络字节输出流OutputStream对象,返回值类型为InputStream
             3.使用网络字节 输出流 OutputStream对象中的write（）方法，给服务器发送数据
             4.使用Socket对象中的getInputStream（）方法获取网络字节输出流InputStream对象,返回值类型为OutputStream
             5.使用网络字节 输出流 InputStream对象中的read（）方法，读取服务器的回写数据(需要服务器先运行才可读取)
             6.释放资源 （Socket）

    注意：1.客户端和服务器进行交互，必须使用Socket中提供的网络流，不能使用自己创建的流（IO流）
         2.当创建Socke对象之后，就会去请求服务器，通过三次握建立连接；
                这时如果服务器没有启动，那么就会抛出异常
                如果服务器已经启动，那么就会进行交互（所以服务器需要先启动）
 */
public class PracticeMain {
    public static void main(String[] args) throws IOException {
        // 1.创建一个客户端对象Socket，构造方法中绑定服务器的IP地址和端口号（可自定义）
        Socket s = new Socket("127.1.0.1",8580);//随便给的

        // 2.使用Socket对象中的getOutputStream（）方法获取网络字节输出流OutputStream对象,返回值为字节输出流类型
        OutputStream outputStream = s.getOutputStream();

        //3.使用网络字节 输出流 OutputStream对象中的write（）方法，给服务器发送数据
        outputStream.write("你好服务器".getBytes());//已字符串的形式写入

        //4.使用Socket对象中的getInputStream（）方法获取网络字节输出流InputStream对象,返回值类型为InputStream
        InputStream inputStream = s.getInputStream();

        // 5.使用网络字节 输出流 InputStream对象中的read（）方法，读取服务器的回写数据(需要服务器先运行才可读取)
        byte [] bytes = new byte[1024];//用数组接收读取内容
        int len = inputStream.read(bytes);//读取的内容长度
        System.out.println(new String(bytes,0,len));//以字符串的形式打印

        //释放资源
        s.close();
    }
}
